8.6 指定行、列方向数据可互转
df.melt()函数是将指定列数据转换到行方向,如果要做相反操作,则可用df.pivot()
此函数可以将行方向的数据调整到列方向显示,转换结果类似数据透视表,不过此函数不支持数据聚合,结构如下:
df.pivot(index=None,colunms=None,values=None)
index :指定用于创建DataFrame表格行索引的列
columns :指定用于创建DataFrame表格列索引的列,
values :用于填充新DataFrame表格值的列,如果未指定,则将使用所有剩余列,如果将是分层索引。
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.8.06 指定行、列方向数据可互转.xlsx" )
print (df)
t=df.pivot(
index = "姓名" ,
columns = "科目"
)
print (t)
返回:
| 姓名 | 科目 | 分数 | |
|---|---|---|---|
| 0 | 李四 | 数学 | 71 |
| 1 | 李四 | 语文 | 70 |
| 2 | 李四 | 英语 | 70 |
| 3 | 王麻子 | 数学 | 72 |
| 4 | 王麻子 | 语文 | 82 |
| 5 | 王麻子 | 英语 | 61 |
| 6 | 张三 | 数学 | 86 |
| 7 | 张三 | 语文 | 82 |
| 8 | 张三 | 英语 | 91 |
| 分数 | |||
|---|---|---|---|
| 科目 | 数学 | 英语 | 语文 |
| 姓名 | |||
| 张三 | 86 | 91 | 82 |
| 李四 | 71 | 70 | 70 |
| 王麻子 | 72 | 61 | 82 |
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.8.06 指定行、列方向数据可互转.xlsx" , 1 )
print (df)
t=df.pivot(
index = "姓名" ,
columns =[ "年份","半年" ],
values = [ "数量1", "数量2" ]
)
print (t)
返回:
| 姓名 | 年份 | 半年 | 数量1 | 数量2 | |
|---|---|---|---|---|---|
| 0 | 张三 | 2018年 | 上半年 | 160 | 112 |
| 1 | 张三 | 2018年 | 下半年 | 121 | 101 |
| 2 | 张三 | 2019年 | 上半年 | 156 | 189 |
| 3 | 张三 | 2019年 | 下半年 | 141 | 124 |
| 4 | 李四 | 2018年 | 上半年 | 170 | 129 |
| 5 | 李四 | 2018年 | 下半年 | 163 | 144 |
| 6 | 李四 | 2019年 | 上半年 | 178 | 197 |
| 7 | 李四 | 2019年 | 下半年 | 105 | 142 |
| 8 | 五麻子 | 2018年 | 上半年 | 122 | 174 |
| 9 | 五麻子 | 2018年 | 下半年 | 195 | 151 |
| 10 | 五麻子 | 2019年 | 上半年 | 131 | 185 |
| 11 | 五麻子 | 2019年 | 下半年 | 125 | 170 |
| 数量1 | 数量2 | |||||||
|---|---|---|---|---|---|---|---|---|
| 年份 | 2018年 | 2019年 | 2018年 | 2019年 | ||||
| 半年 | 上半年 | 下半年 | 上半年 | 下半年 | 上半年 | 下半年 | 上半年 | 下半年 |
| 姓名 | ||||||||
| 五麻子 | 122 | 195 | 131 | 125 | 174 | 151 | 185 | 170 |
| 张三 | 160 | 121 | 156 | 141 | 112 | 101 | 189 | 124 |
| 李四 | 170 | 163 | 178 | 105 | 129 | 144 | 197 | 142 |
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.8.06 指定行、列方向数据可互转.xlsx" , 2 )
print (df)
t=df.pivot_table(
index = "日期" ,
columns =[ "产品" ],
aggfunc ={ "金额":"sum" }
)
print (t)
#如第0、1行数据有重复,所以不能用pivot了,只能用数据透视pivot_table了
| 日期 | 产品 | 金额 | |
|---|---|---|---|
| 0 | 2024-04-01 | A | 87 |
| 1 | 2024-04-01 | A | 100 |
| 2 | 2024-04-01 | B | 60 |
| 3 | 2024-04-02 | A | 85 |
| 4 | 2024-04-02 | B | 82 |
| 5 | 2024-04-02 | B | 76 |
| 6 | 2024-04-02 | A | 62 |
| 7 | 2024-04-03 | A | 64 |
| 8 | 2024-04-03 | C | 64 |
| 金额 | |||
|---|---|---|---|
| 产品 | A | B | C |
| 日期 | |||
| 2024-04-01 | 187.0 | 60.0 | NaN |
| 2024-04-02 | 147.0 | 158.0 | NaN |
| 2024-04-03 | 64.0 | NaN | 64.0 |